package lib;

import java.util.ArrayList;

public abstract class Ensemble {
	/**
	 * <h1>Constante <b>VIDE</b></h1>
	 * 
	 * Permet de définir un ensemble vide. Correspond à la constante Java <b>null</b>.
	 */
	public static final Object VIDE = null;
	private int cardinal;
	/**
	 * <h1>Attribut <b>type</b></h1>
	 * 
	 * Permet de connaître le type d'implémentation de l'ensemble.
	 * <ul>
	 * <li><b>liste</b> implémentation de type Liste (ArrayListe <Element>)</li>
	 * <li><b>tableau</b>implémentation de type tableau (Element[])</li>
	 * </ul>
	 */
	private String type;
	
	/**
	 * <h1>Constructeur <b>Ensemble</b></h1>
	 * 
	 * Constructeur de la classe abstraite Ensemble. Créer un ensemble avec pour cardinalitée 0. 
	 */
	public Ensemble()
	{
		this.cardinal=0;
	}
	
	/**
	 * <h1>Méthode <b>getElements</b></h1>
	 * 
	 * Méthode qui permets d'accéder aux données de l'ensemble.
	 * @return 
	 * <ul>
	 * <li><b>Un tableau de données<b> dans le cas d'une implémentation en tableau.</li>
	 * <li><b>Une liste de données</b> dans le cas d'une implémentation par liste.</li>
	 * </ul>
	 */
	public ArrayList<Element> getElements()
	{
		return null;
	}
	
	/**
	 * <h1>Méthode <b>retraitElement</b></h1>
	 * 
	 * Permet d'enlever l'élement passé en paramètre des données de l'ensemble
	 * @param el l'élement à supprimer
	 */
	public void retraitElement(Element el)
	{
		
	}
	
	/**
	 * <h1>Méthode <b>ajoutElement</b></h1>
	 * 
	 * Permet d'ajouter l'élement passé en paramètre aux données de l'ensemble
	 * @param el l'élement à ajouter
	 */
	public void ajoutElement(Element el){
		
		
	}
	
	/**
	 * <h1>Méthode <b>getType</b></h1>
	 * 
	 * Permet de connaître le type d'implémentation de l'ensemble.
	 * 
	 * @return
	 * <ul>
	 * <li><b>liste</b> implémentation de type Liste (ArrayListe <Element>)</li>
	 * <li><b>tableau</b>implémentation de type tableau (Element[])</li>
	 * </ul>
	 */
	public String getType() {
		return type;
	}

	/**
	 * <h1>Méthode <b>setType</b></h1>
	 * 
	 * Permet d'initialiser l'attribut Type de l'instance. A n'utiliser qu'a l'instanciation.
	 * <ul>
	 * <li><b>liste</b> implémentation de type Liste (ArrayListe <Element>)</li>
	 * <li><b>tableau</b>implémentation de type tableau (Element[])</li>
	 * </ul>
	 */
	protected void setType(String type) {
		this.type = type;
	}

	/**
	 * <h1>Méthode <b>getCardinal</b></h1>
	 * 
	 * Retourne le cardinal de l'ensemble (nombre de valeur contenues dans l'ensemble).
	 * @return cardinal de l'ensemble
	 */
	public int getCardinal() {
		return cardinal;
	}

	/**
	 * <h1>Méthode <b>setCardinal</b></h1>
	 * 
	 * Permet de changer le cardinal de l'ensemble (nombre de valeur contenues dans l'ensemble).
	 * @param cardinal de l'ensemble
	 */
	protected void setCardinal(int cardinal) {
		this.cardinal = cardinal;
	}
	
	/**
	 * <h1>Méthode <b>testElement</b></h1>
	 * 
	 * Permet de tester l'appartenance d'un element à un ensemble.
	 * @param Element el à tester
	 * @return 
	 * <ul>
	 * <li><b>true</b> Si l'élement est contenu dans l'ensemble</li>
	 * <li><b>false</b> Si l'élement n'appartient pas à l'ensemble</li>
	 * </ul>
	 */
	public boolean testElement(Element el)
	{
		return false;
	}

	/**
	 * <h1>Méthode <b>intersection</b></h1>
	 * 
	 * Cette fonction créer l'ensemble de l'intersection de l'ensemble sur lequel elle s'applique et celui passé en paramètres.
	 * @param Ensemble ensemble 
	 * @return L'ensemble de l'intersection
	 */
	public Ensemble intersection(Ensemble ensemble)
	{
		return null;
	}
	
	/**
	 * <h1>Méthode <b>complementaire</b></h1>
	 * 
	 * Cette fonction créer l'ensemble complémentaire entre l'ensemble sur lequel elle s'applique et celui passé en paramètre.
	 * @param Ensemble ensemble 
	 * @return L'ensemble de complaimentaire
	 */
	public Ensemble complementaire(Ensemble ensemble)
	{
		return null;
	}

	/**
	 * <h1>Méthode <b>afficheEnsemble</b></h1>
	 * 
	 * Cette fonction affiche les éléments de l'ensemble un à un.
	 */
	public void afficheEnsemble()
	{
		
	}
	
	public void setElements(ArrayList<Element> elements)
	{
		for(Element e : elements)
		{
			this.ajoutElement(e);
		}
		
	}
	
	public String toString()
	{
		return "Ensemble de type "+this.getType()+" ["+this.getCardinal()+"]";
	}
	
}
